<div id="calc">
<div class="input"><div class="numbers">0</div><div class="history"></div><div class="memory">M</div><div class="loader"></div></div>
<div class="button mem">MC</div>
<div class="button mem">MR</div>
<div class="button mem">MS</div>
<div class="button mem">M+</div>
<div class="button mem">M-</div>

<div class="button oper">&#8592;</div>
<div class="button oper clear">CE</div>
<div class="button oper clear">C</div>
<div class="button oper">&#177;</div>
<div class="button oper">&#8730;</div>

<div class="button num">7</div>
<div class="button num">8</div>
<div class="button num">9</div>
<div class="button oper">/</div>
<div class="button oper">%</div>

<div class="button num">4</div>
<div class="button num">5</div>
<div class="button num">6</div>
<div class="button oper">*</div>
<div class="button oper">1/x</div>

<div class="button num">1</div>
<div class="button num">2</div>
<div class="button num">3</div>
<div class="button oper">-</div>
<div class="button oper equ">=</div>


<div class="button num zero up">0</div>
<div class="button num up">,</div>
<div class="button oper up">+</div>
<div class="exit"><a href="#">Выход</a></div>
</div>

<script>

var op = false; //Флаг нажатой операции
var key = false; //Флаг сброса при нажатии клавиши
var number = 0; //Текущее число
var loper = 0; //Предыдущая операция
var larg = 0; //Последний аргумент
var fhis = false; // Флаг если аргумент уже передан в историю
var fnumhis = false; // Флаг необходимости удалить последнюю запись в истории
var mem = 0; // Память калькулятора
var fl = 0; // Флаг для смены форм


//Обработка цифровых клавиш
$('.num').click(function(){
	
	//Если выключены - выходим
	if ($(this).hasClass('disabled')) return;
	
	//Если установлен флаг операции или очистки, то очищаем табло
	if (op || key) {$('.input .numbers').text('0'); op = false;}
	
	//Удаляем последнюю историю, если нужно
	deleteLastHistory();
	
	if ($(this).index()==27)//Запятая [,]
	{
		var s = $('.input .numbers').text();
		if (s.indexOf(',')!=-1) return;
	}
	else // [1] [2] [3] [4] [5] [6] [7] [8] [9] [0]
	{
		//Если там был ноль, то убираем его
		if ($('.input .numbers').text()=='0') 
		$('.input .numbers').empty();
	}
	// Дописываем нажатую клавишу
	$('.input .numbers').append($(this).text());

	//Проверяем изменения
	inputChange();
	//Отключаем флаг
	key = false;
});

//Обработка клавиш очистки
$('.clear').click(function(){

	//Если выключены - выходим
	if ($(this).hasClass('disabled')) return;
	
	if ($(this).index()==7) // [CE]
	{
		$('.input .numbers').text('0');
	}
	else // [С]
	{
		$('.input .numbers').text('0');
		$('.input .history').empty();
		op = false;
		number = 0; 
		loper = 0; 
		larg = 0;
		fhis = false; 
		key = false;
	}
	inputChange();
});

//Обработка клавиш памяти
$('.mem').click(function(){
	
	//Если выключены - выходим
	if ($(this).hasClass('disabled')) return;
	
	var num = toFloat($('.input .numbers').text());	
	
	switch ($(this).index())
	{
		case 3: // [MS]
			mem = num;
			if (mem==0) $('.memory').hide(); else $('.memory').show();
			key = true;
			break;
		case 2: // [MR]
			if (mem==0)	return;
			$('.input .numbers').text(toStr(mem));
			key = true;
			break;
		case 1: // [MC]
			mem = 0;
			$('.memory').hide();
			key = true;
			break;
		case 4: // [M+]
			mem += num;
			key = true;
			$('.memory').show();
			break;
		case 5: // [M-]
			mem -= num;
			key = true;
			$('.memory').show();
			break;
	}
	inputChange();
}
);

// Обработка клавиш операций
$('.oper').click(function(){
	
	//Если выключены - выходим
	if ($(this).hasClass('disabled')) return;
	if (op && !fnumhis) return;
	deleteLastHistory();
	
	switch ($(this).index())
	{
		case 6:				// Back [←]
			var s = $('.input .numbers').text();
			if (s=='0') return;
			if (s.length==1)
			s = '0';
			else
			s = s.substring(0,s.length-1);		
			$('.input .numbers').text(toStr(s));
			inputChange();
			break;
			
		case 9:				//  [±]
			var s = $('.input .numbers').text();
			if (s=='0') return;
			if (s[0]=='-')
			s = s.substring(1);
			else
			s = '-'+s;
			$('.input .numbers').text(toStr(s));
			inputChange();
			break;
				
		case 24:			//Minus [-]
			calculate(function(){
				var s = $('.input .numbers').text();					
				op = true;
				loper = 3;
				addHistory();
			});			
			break;
			
		case 28: 			//Plus [+]
			calculate(function(){
				var s = $('.input .numbers').text();			
				op = true;
				loper = 4;
				addHistory();
			});
			break;
			
		case 19: 			//Multiply [*]
			calculate(function(){
				var s = $('.input .numbers').text();			
				op = true;
				loper = 2;
				addHistory();
			});	
			break;
			
		case 14:			//Divide [/]
			calculate(function(){
				var s = $('.input .numbers').text();			
				op = true;
				loper = 1;
				addHistory();
			});
			break;
			
		case 25:			//  [=]
			calculate(function(){
				var s = $('.input .numbers').text();
				$('.input .history').empty();
				key = true;
				op = false;
				number = 0; 
				loper = 0; 
				//loper = 5; 
				larg = 0;
				fhis = false;
			});
			break;
			
		case 20:			//  [1/x]						
			var num = toFloat($('.input .numbers').text());;
			if (num==0) return;
			larg = num;
			num = 1/num;			
			addHistory(6);
			fhis = true;
			$('.input .numbers').text(toStr(num))
			break;
			
		case 10:			//   sqrt	[√]
			var num = toFloat($('.input .numbers').text());;
			larg = num;
			num = Math.sqrt(num);			
			addHistory(8);
			fhis = true;
			$('.input .numbers').text(toStr(num))
			break;
			
		case 15:			// [%]			
			if (number==0) return;
			var num = toFloat($('.input .numbers').text());;
			num = number*num/100;	
			larg = num;
			$('.input .numbers').text(toStr(num))
			addHistory(7);
			//calculate();
			op = true;
			fnumhis = true;
			break;
		
	}
	inputChange();
	
	
});

//Перехват клавиш
$(document).keypress(function(event){ 

	switch(event.which)
	{
		case 48: $('.button:eq(25)').click(); break; //0
		case 49: $('.button:eq(20)').click(); break; //1
		case 50: $('.button:eq(21)').click(); break; //2
		case 51: $('.button:eq(22)').click(); break; //3
		case 52: $('.button:eq(15)').click(); break; //4
		case 53: $('.button:eq(16)').click(); break; //5
		case 54: $('.button:eq(17)').click(); break; //6
		case 55: $('.button:eq(10)').click(); break; //7
		case 56: $('.button:eq(11)').click(); break; //8
		case 57: $('.button:eq(12)').click(); break; //9		
		case 44: case 46: $('.button:eq(26)').click(); break; //,
		
		
		case 0: $('.button:eq(7)').click(); break; // Esc
		
		case 43: $('.button:eq(27)').click(); break; // +
		case 45: $('.button:eq(23)').click(); break; // -
		case 42: $('.button:eq(18)').click(); break; // *
		case 47: $('.button:eq(13)').click(); break; // *
		
		case 13: $('.button:eq(24)').click(); break; // =
		
		case 8: $('.button:eq(5)').click(); break; // Back
	}


});

// Кнопка выхода
$('.exit a').click(
function(){
	$.post('/ajax/exit',{a:'a'},function(data){
		
		$data = $.parseJSON(data);
		if ($data.code==0)
		{
			// Если форма уже есть просто отображаем ее, иначе загружаем
			if ($('#enterform').length==0)
			{
				fl = 0;
				$('#calc').animate({opacity:'hide'},300);
				setTimeout('halfReady2()',350);
				$('<div>').css('display','none').load('/ajax/form',{},function(){halfReady2();}).appendTo('body');
			}
			else
			{
				$('#calc').animate({opacity:'hide'},300);
				$('#enterform #login').val('');
				$('#enterform #pass').val('');
				setTimeout(function(){$('#enterform').animate({opacity:'show'},300);},350);
			}			
		}
		else
		showMessage($data.mess)		
		
	});
});


// Удаление из истории последнего числа
function deleteLastHistory()
{
	if (fnumhis) 
	{	
		//Удаляем последнее число в истории
		var h = $('.input .history').text();		
		h = h.substring(0,h.lastIndexOf(' ')+1);	
		$('.input .history').text(h);
		fnumhis = false;
	}
}

//Добавление в историю
function addHistory(oper)
{
	oper = oper?oper:loper;
	
	switch (oper)
	{
		case 1: //Деление
			if (fhis)
			$('.input .history').append(' / ');
			else
			$('.input .history').append(toStr(larg)+' / ');
			break;
		case 2: //Умножение
			if (fhis)
			$('.input .history').append(' * ');
			else
			$('.input .history').append(toStr(larg)+' * ');
			break;
		case 3: //Вычитание		
			if (fhis)
			$('.input .history').append(' - ');
			else
			$('.input .history').append(toStr(larg)+' - ');		
			break;
		case 4: //Сложение
			if (fhis)
			$('.input .history').append(' + ');
			else
			$('.input .history').append(toStr(larg)+' + ');
			break;
		case 6: //  1/x
			$('.input .history').append(' reciproc('+toStr(larg)+') ');
			break;
		case 8: //  sqrt
			$('.input .history').append(' sqrt('+toStr(larg)+') ');	
			break;
		case 7: //  %
			$('.input .history').append(toStr(larg));
			break;
			
	
	}
	fhis = false;
}

//Преобразование к флоату с заменой запятой на точку
function toFloat(s)
{
	
	return parseFloat(s.replace(',','.'));
}
//Преобразование к строке с заменой точки на запятую
function toStr(f)
{
	f = f+'';
	return f.replace('.',',');
}

//Вычисление
function calculate(callback)
{
	callback = callback?callback:function(){};
	larg = toFloat($('.input .numbers').text());
	if (loper>0 && loper<5)
	{
		$('.input .loader').show();
		$('.button').addClass('disabled');
	}
	switch (loper)
	{
		case 1: //Деление
			
			$.post('/ajax/calculate',{oper:'divide',num1:number,num2:larg},function(data){ resCalculate(data,callback);});
			number /=  larg;
			break;
		case 2: //Умножение
			
			$.post('/ajax/calculate',{oper:'multiply',num1:number,num2:larg},function(data){ resCalculate(data,callback);});
			number *=  larg;
			break;
		case 3: //Вычитание		
				
			$.post('/ajax/calculate',{oper:'minus',num1:number,num2:larg},function(data){ resCalculate(data,callback);});
			number -=  larg;
			break;
		case 4: //Сложение
			
			$.post('/ajax/calculate',{oper:'plus',num1:number,num2:larg},function(data){ resCalculate(data,callback);});
			number +=  larg;
			break;
		default:
			$('.button').removeClass('disabled');
			callback();
			number = larg;
	}
	/*$('.input .numbers').text(number)
	inputChange();*/
}

//Пришел ответ от сервера
function resCalculate(data,callback)
{	
	$data = $.parseJSON(data);
	if ($data.code==0)
	{
		//Если все впорядку отображаем результат и выполняем калбак
		number = parseFloat($data.mess);
		$('.input .numbers').text(toStr(number))
		callback();
		inputChange();
		
	}
	else
	{
		//Если нет, показываем ошибку. Если код=2, то выходим на окно входа (отсутствие авторизации)
		if ($data.code==2)
		$('.exit a').click();
		showMessage($data.mess);
	}
	$('.button').removeClass('disabled');
	$('.input .loader').hide();

}

//Обновление поля ввода
function inputChange()
{
	var s = $('.input  .numbers').text();
	if (s.length>12)
	{
		$('.input .numbers').addClass('small');
	}
	else
	$('.input .numbers').removeClass('small');
	if (s.length>16)
	{
		s = s.substring(0,16);
		$('.input .numbers').text(toStr(s));
	}
	
}

//Ожидание загрузки и скрытия блока
function halfReady2()
{
	fl++;
	if (fl==2)
	{
		$('#enterform').parent().animate({opacity:'show'},300);
	}
}
</script>